package net.facelib.sdk;

import net.facelib.live.LiveCodeInfo;
import net.facelib.live.LiveStatus;
import net.facelib.sdk.UserInfoManagement.User;
import net.gdface.sdk.CodeInfo;

/**
 * 人脸检测识别回调接口
 * @author guyadong
 *
 */
public interface FaceCaptureCallback {

	/**
	 * 人脸检测回调方法(检测到人脸)<br>
	 * @param context 视频捕获上下文对象
	 * @param codes 人脸位置信息对象数组(不包含人脸特征数据)
	 * @return 过滤后的人脸位置数据,默认返回{@code codes},
	 * 		应用层可以根据需要对人脸位置数据进行过滤,只保留符合条件的数据返回(对应数组元素置为 {@code null}或返回不包含{@code null}元素的新数组),
	 * 		Face capturer会基于返回的数据进行下一步处理
	 */
	CodeInfo[] onFaceDetected(CaptureContext context, CodeInfo[] codes);

	/**
	 * 没有检测到人脸异常回调方法
	 * @param context 视频捕获上下文对象
	 */
	void onNotFaceDetectedException(CaptureContext context);

	/**
	 * 活体检测回调方法
	 * @param context 视频捕获上下文对象
	 * @param codes 人脸位置信息对象数组
	 */
	void onLiveFaces(CaptureContext context, LiveCodeInfo[] codes);

	/**
	 * 活体检测异常回调方法
	 * @param context 视频捕获上下文对象
	 * @param e 异常对象
	 */
	void onLiveFaceError(CaptureContext context, Throwable e);

	/**
	 * 活体检测算法返回错误回调方法<br>
	 * @param context 视频捕获上下文对象
	 * @param liveStatus 活体检测状态 
	 */
	void onLiveFaceError(CaptureContext context, LiveStatus liveStatus);

	/**
	 * 特征提取成功回调方法
	 * @param context 视频捕获上下文对象
	 * @param codes 包含人脸特征及人脸位置信息的{@link CodeInfo}数组
	 */
	void onFaceFeature(CaptureContext context, CodeInfo[] codes);

	/**
	 * 特征提取异常回调方法
	 * @param context 视频捕获上下文对象
	 * @param codes 人脸位置信息对象数组
	 * @param e 异常对象
	 */
	void onFeatureError(CaptureContext context, CodeInfo[] codes, Throwable e);

	/**
	 * 1:1 人脸识别成功回调方法
	 * @param context 视频捕获上下文对象
	 * @param code 人脸位置信息对象
	 * @param user 用户信息对象
	 * @param similarity 特征对比相似度
	 */
	void onRecongizeOne(CaptureContext context, CodeInfo code, User user,double similarity);

	/**
	 *  1:N 人脸识别成功回调方法
	 * @param context 视频捕获上下文对象
	 * @param codes 包含人脸特征及人脸位置信息的{@link CodeInfo}数组
	 * @param users 与{@code codes}下标对应的用户信息对象数组
	 * @param similarity 与{@code codes}下标对应的特征对比相似度数组
	 */
	void onRecongizeN(CaptureContext context, CodeInfo[] codes, User[] users, double[] similarity);

	/**
	 * 人脸识别异常回调方式
	 * @param context 视频捕获上下文对象
	 * @param codes 包含人脸特征及人脸位置信息的{@link CodeInfo}数组
	 * @param e 异常对象
	 */
	void onRecongizeError(CaptureContext context, CodeInfo[] codes, Throwable e);
	/**
	 * 未声明的异常回调方法
	 * @param e  异常对象
	 */
	void onUndeclaredException(Throwable e);

	/**
	 * 视频捕获未声明的异常回调方法
	 * @param context 视频捕获上下文对象
	 * @param e  异常对象
	 */
	void onUndeclaredCaptureException(CaptureContext context, Throwable e);

	/**
	 * 摄像头设备异常回调方法
	 * @param e  异常对象
	 */
	void onCameraException(Throwable e);

	/**
	 * 用户人脸数据注册完成
	 * @param userInfoManagement
	 */
	void onUserFaceRegistered(UserInfoManagement userInfoManagement);
}
